84template <
typename D1,
typename D2>
85inline Matrix<typename D1::Scalar, 3, 3>
Q_helper(
const MatrixBase<D1>& v,
const MatrixBase<D2>& w)
87 typedef typename D1::Scalar T;
89 Matrix<T, 3, 3> V =
skew(v);
90 Matrix<T, 3, 3> W =
skew(w);
91 Matrix<T, 3, 3> WV = W * V, VW = V * W, WW = W * W;
93 T th_2 = w.squaredNorm();
99 c2 = T(1. / 6.) - th_2 / T(120.) + th_4 / T(5040.);
100 c3 = T(1. / 24.) - th_2 / T(720.) + th_4 / T(40320.);
101 c4 = T(1. / 120.) - th_2 / T(2520.) + th_4 / T(120960.);
108 c2 = (th - sin_th) / (th_2 * th);
109 c3 = (th_2 + T(2.0) * cos_th - T(2.0)) / (T(2.0) * th_2 * th_2);
110 c4 = (T(2.0) * th - T(3.0) * sin_th + th * cos_th) / (T(2.0) * th_2 * th_2 * th);
113 Matrix<T, 3, 3> WVW = WV * W;
115 T(0.5) * V + c2 * (WV + VW + WVW) + c3 * (WW * V + VW * W - T(3.0) * WVW) + c4 * (WVW * W + WW * V * W);
122inline Matrix<typename D::Scalar, 6, 6>
jac_SE3_left(
const MatrixBase<D>& tangent)
125 typedef typename D::Scalar T;
127 Matrix<T, 3, 1> v = tangent.template head<3>();
128 Matrix<T, 3, 1> w = tangent.template tail<3>();
132 Matrix<T, 6, 6> Jl_SE3;
133 Jl_SE3.topLeftCorner(3, 3) = Jl;
134 Jl_SE3.bottomRightCorner(3, 3) = Jl;
135 Jl_SE3.topRightCorner(3, 3) =
Q_helper(v, w);
136 Jl_SE3.bottomLeftCorner(3, 3).setZero();
143inline Matrix<typename D::Scalar, 6, 6>
jac_SE3_right(
const MatrixBase<D>& tangent)
145 return jac_SE3_left(Matrix<typename D::Scalar, 6, 1>(-tangent));
154 typedef typename D::Scalar T;
156 Matrix<T, 3, 1> v = tangent.template head<3>();
157 Matrix<T, 3, 1> w = tangent.template tail<3>();
161 Matrix<T, 6, 6> Jl_inv_SE3;
162 Jl_inv_SE3.topLeftCorner(3, 3) = Jl_inv;
163 Jl_inv_SE3.bottomRightCorner(3, 3) = Jl_inv;
164 Jl_inv_SE3.topRightCorner(3, 3) = -Jl_inv *
Q_helper(v, w) * Jl_inv;
165 Jl_inv_SE3.bottomLeftCorner(3, 3).setZero();
180template <
typename D1,
typename D2>
181inline void identity(MatrixBase<D1>& p, QuaternionBase<D2>& q)
188template <
typename D1,
typename D2>
189inline void identity(MatrixBase<D1>& p, MatrixBase<D2>& q)
194 Map<Quaternion<typename D2::Scalar>> mq(&q(0));
203 Map<Matrix<typename D::Scalar, 3, 1>> p(&d(0));
204 Map<Quaternion<typename D::Scalar>> q(&d(3));
208template <
typename T =
double>
234template <
typename D1,
typename D2,
typename D4,
typename D5>
235inline void inverse(
const MatrixBase<D1>& p,
const QuaternionBase<D2>& q, MatrixBase<D4>& ip, QuaternionBase<D5>& iq)
240 ip = -(q.conjugate() * p);
244template <
typename D1,
typename D2,
typename D4,
typename D5>
245inline void inverse(
const MatrixBase<D1>& p,
const MatrixBase<D2>& q, MatrixBase<D4>& ip, MatrixBase<D5>& iq)
250 Map<const Quaternion<typename D2::Scalar>> mq(&q(0));
251 Map<Quaternion<typename D5::Scalar>> miq(&iq(0));
256template <
typename D1,
typename D2>
257inline void inverse(
const MatrixBase<D1>& d, MatrixBase<D2>&
id)
262 Map<const Matrix<typename D1::Scalar, 3, 1>> p(&d(0));
263 Map<const Quaternion<typename D1::Scalar>> q(&d(3));
264 Map<Matrix<typename D2::Scalar, 3, 1>> ip(&
id(0));
265 Map<Quaternion<typename D2::Scalar>> iq(&
id(3));
271inline Matrix<typename D::Scalar, 7, 1>
inverse(
const MatrixBase<D>& d)
273 Matrix<typename D::Scalar, 7, 1> id;
282 inverse(v.at(
'P'), v.at(
'O'), c[
'P'], c[
'O']);
295template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D7,
typename D8>
297 const QuaternionBase<D2>& q1,
298 const MatrixBase<D4>& p2,
299 const QuaternionBase<D5>& q2,
301 QuaternionBase<D8>& qc)
311template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D7,
typename D8>
313 const MatrixBase<D2>& q1,
314 const MatrixBase<D4>& p2,
315 const MatrixBase<D5>& q2,
323 Map<const Quaternion<typename D2::Scalar>> mq1(&q1(0));
324 Map<const Quaternion<typename D5::Scalar>> mq2(&q2(0));
325 Map<Quaternion<typename D8::Scalar>> mqc(&qc(0));
327 compose(p1, mq1, p2, mq2, pc, mqc);
330template <
typename D1,
typename D2,
typename D3>
331inline void compose(
const MatrixBase<D1>& d1,
const MatrixBase<D2>& d2, MatrixBase<D3>& sum)
337 Map<const Matrix<typename D1::Scalar, 3, 1>> p1(&d1(0));
338 Map<const Quaternion<typename D1::Scalar>> q1(&d1(3));
339 Map<const Matrix<typename D2::Scalar, 3, 1>> p2(&d2(0));
340 Map<const Quaternion<typename D2::Scalar>> q2(&d2(3));
341 Map<Matrix<typename D3::Scalar, 3, 1>> pc(&sum(0));
342 Map<Quaternion<typename D3::Scalar>> qc(&sum(3));
344 compose(p1, q1, p2, q2, pc, qc);
347template <
typename D1,
typename D2>
348inline Matrix<typename D1::Scalar, 7, 1>
compose(
const MatrixBase<D1>& d1,
const MatrixBase<D2>& d2)
350 Matrix<typename D1::Scalar, 7, 1> ret;
355template <
typename D1,
typename D2,
typename D3,
typename D4,
typename D5>
357 const MatrixBase<D2>& d2,
359 MatrixBase<D4>& J_sum_d1,
360 MatrixBase<D5>& J_sum_d2)
369 Matrix<typename D1::Scalar, 3, 3> dR1 =
q2R(d1.segment(3, 4));
370 Matrix<typename D2::Scalar, 3, 3> dR2 =
q2R(d2.segment(3, 4));
373 J_sum_d1.setIdentity();
374 J_sum_d1.block(0, 3, 3, 3).noalias() = -dR1 *
skew(d2.head(3));
375 J_sum_d1.block(3, 3, 3, 3) = dR2.transpose();
378 J_sum_d2.setIdentity();
379 J_sum_d2.block(0, 0, 3, 3) = dR1;
391 compose(x1.at(
'P'), x1.at(
'O'), x2.at(
'P'), x2.at(
'O'), c[
'P'], c[
'O']);
432template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D7,
typename D8>
434 const QuaternionBase<D2>& q1,
435 const MatrixBase<D4>& p2,
436 const QuaternionBase<D5>& q2,
438 QuaternionBase<D8>& q12)
444 p12 = q1.conjugate() * (p2 - p1);
445 q12 = q1.conjugate() * q2;
448template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D7,
typename D8>
450 const MatrixBase<D2>& q1,
451 const MatrixBase<D4>& p2,
452 const MatrixBase<D5>& q2,
460 Map<const Quaternion<typename D2::Scalar>> mq1(&q1(0));
461 Map<const Quaternion<typename D5::Scalar>> mq2(&q2(0));
462 Map<Quaternion<typename D8::Scalar>> mq12(&q12(0));
464 between(p1, mq1, p2, mq2, p12, mq12);
467template <
typename D1,
typename D2,
typename D3>
468inline void between(
const MatrixBase<D1>& d1,
const MatrixBase<D2>& d2, MatrixBase<D3>& d12)
474 Map<const Matrix<typename D1::Scalar, 3, 1>> p1(&d1(0));
475 Map<const Quaternion<typename D1::Scalar>> q1(&d1(3));
476 Map<const Matrix<typename D2::Scalar, 3, 1>> p2(&d2(0));
477 Map<const Quaternion<typename D2::Scalar>> q2(&d2(3));
478 Map<Matrix<typename D3::Scalar, 3, 1>> p12(&d12(0));
479 Map<Quaternion<typename D3::Scalar>> q12(&d12(3));
481 between(p1, q1, p2, q2, p12, q12);
484template <
typename D1,
typename D2>
485inline Matrix<typename D1::Scalar, 7, 1>
between(
const MatrixBase<D1>& d1,
const MatrixBase<D2>& d2)
487 Matrix<typename D1::Scalar, 7, 1> d12;
496 between(x1.at(
'P'), x1.at(
'O'), x2.at(
'P'), x2.at(
'O'), x12[
'P'], x12[
'O']);
509template <
typename D1,
typename D2,
typename D3,
typename D4>
510inline void exp(
const MatrixBase<D1>& rho,
const MatrixBase<D2>& theta, MatrixBase<D3>& p, QuaternionBase<D4>& q)
521template <
typename D1,
typename D2,
typename D3,
typename D4>
522inline void exp(
const MatrixBase<D1>& rho,
const MatrixBase<D2>& theta, MatrixBase<D3>& p, MatrixBase<D4>& q)
526 Map<Quaternion<typename D4::Scalar>> mq(&q(0));
527 exp(rho, theta, p, mq);
530template <
typename D1,
typename D2>
531inline void exp(
const MatrixBase<D1>& tau, MatrixBase<D2>& delta)
536 Map<const Matrix<typename D1::Scalar, 3, 1>> rho(&tau(0));
537 Map<const Matrix<typename D1::Scalar, 3, 1>> theta(&tau(3));
538 Map<Matrix<typename D2::Scalar, 3, 1>> p(&delta(0));
539 Map<Quaternion<typename D2::Scalar>> q(&delta(3));
541 exp(rho, theta, p, q);
545inline Matrix<typename D::Scalar, 7, 1>
exp(
const MatrixBase<D>& tau)
547 Matrix<typename D::Scalar, 7, 1> delta;
552template <
typename D1,
typename D2,
typename D3>
553inline void exp(
const MatrixBase<D1>& tau, MatrixBase<D2>& delta, MatrixBase<D3>& J_delta_tau)
559 typedef typename D1::Scalar T;
561 Matrix<T, 6, 1> tau_tmp = tau;
562 Matrix<T, 3, 1> rho = tau_tmp.template head<3>();
563 Matrix<T, 3, 1> theta = tau_tmp.template tail<3>();
565 Matrix<T, 3, 1> p = Jl * rho;
573 J_delta_tau.setZero();
574 J_delta_tau.template topLeftCorner<3, 3>() = Jl;
575 J_delta_tau.template topRightCorner<3, 3>() =
Q_helper(rho, theta) -
skew(p) * Jl;
576 J_delta_tau.template bottomRightCorner<3, 3>() =
jac_SO3_right(theta);
586 exp(tau.at(
'P'), tau.at(
'O'), p, q);
601template <
typename D1,
typename D2,
typename D3,
typename D4>
602inline void log(
const MatrixBase<D1>& p,
const QuaternionBase<D2>& q, MatrixBase<D3>& rho, MatrixBase<D4>& theta)
609 Matrix<typename D2::Scalar, 3, 1> th =
log_q(q);
614template <
typename D1,
typename D2,
typename D3,
typename D4>
615inline void log(
const MatrixBase<D1>& p,
const MatrixBase<D2>& q, MatrixBase<D3>& rho, MatrixBase<D4>& theta)
619 Map<const Quaternion<typename D2::Scalar>> mq(&q(0));
620 log(p, mq, rho, theta);
623template <
typename D1,
typename D2>
624inline void log(
const MatrixBase<D1>& delta, MatrixBase<D2>& tau)
629 Map<const Matrix<typename D1::Scalar, 3, 1>> p(&delta(0));
630 Map<const Quaternion<typename D1::Scalar>> q(&delta(3));
631 Map<Matrix<typename D2::Scalar, 3, 1>> rho(&tau(0));
632 Map<Matrix<typename D2::Scalar, 3, 1>> theta(&tau(3));
634 log(p, q, rho, theta);
638inline Matrix<typename D::Scalar, 6, 1>
log(
const MatrixBase<D>& delta)
640 Matrix<typename D::Scalar, 6, 1> tau;
645template <
typename D1,
typename D2,
typename D3>
646inline void log(
const MatrixBase<D1>& delta, MatrixBase<D2>& tau, MatrixBase<D3>& J_tau_delta)
652 typedef typename D1::Scalar T;
654 Matrix<T, 6, 1> tau_tmp;
656 Matrix<T, 3, 1> rho = tau_tmp.template head<3>();
657 Matrix<T, 3, 1> theta = tau_tmp.template tail<3>();
658 Matrix<T, 3, 1> p = delta.template head<3>();
668 J_tau_delta.setZero();
669 J_tau_delta.template topLeftCorner<3, 3>() = Jl_inv;
670 J_tau_delta.template topRightCorner<3, 3>() = -Jl_inv * B * Jr_inv;
671 J_tau_delta.template bottomRightCorner<3, 3>() = Jr_inv;
680 log(delta.at(
'P'), delta.at(
'O'), rho, theta);
695template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D7,
typename D8>
696inline void plus(
const MatrixBase<D1>& p1,
697 const QuaternionBase<D2>& q1,
698 const MatrixBase<D4>& p2,
699 const MatrixBase<D5>& o2,
700 MatrixBase<D7>& plus_p,
701 QuaternionBase<D8>& plus_q)
709 plus_q = q1 *
exp_q(o2);
712template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D7,
typename D8>
713inline void plus(
const MatrixBase<D1>& p1,
714 const MatrixBase<D2>& q1,
715 const MatrixBase<D4>& p2,
716 const MatrixBase<D5>& o2,
717 MatrixBase<D7>& plus_p,
718 MatrixBase<D8>& plus_q)
723 Map<const Quaternion<typename D2::Scalar>> q1m(&q1(0));
724 Map<Quaternion<typename D8::Scalar>> plus_qm(&plus_q(0));
726 plus(p1, q1m, p2, o2, plus_p, plus_qm);
729template <
typename D1,
typename D2,
typename D3>
730inline void plus(
const MatrixBase<D1>& d1,
const MatrixBase<D2>& d2, MatrixBase<D3>& d_plus)
736 Map<const Matrix<typename D1::Scalar, 3, 1>> p1(&d1(0));
737 Map<const Quaternion<typename D1::Scalar>> q1(&d1(3));
738 Map<const Matrix<typename D2::Scalar, 3, 1>> p2(&d2(0));
739 Map<const Matrix<typename D2::Scalar, 3, 1>> o2(&d2(3));
740 Map<Matrix<typename D3::Scalar, 3, 1>> p_p(&d_plus(0));
741 Map<Quaternion<typename D3::Scalar>> q_p(&d_plus(3));
743 plus(p1, q1, p2, o2, p_p, q_p);
746template <
typename D1,
typename D2>
747inline Matrix<typename D1::Scalar, 7, 1>
plus(
const MatrixBase<D1>& d1,
const MatrixBase<D2>& d2)
749 Matrix<typename D1::Scalar, 7, 1> d_plus;
750 plus(d1, d2, d_plus);
758 plus(x.at(
'P'), x.at(
'O'), tau.at(
'P'), tau.at(
'O'), res[
'P'], res[
'O']);
771template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D7,
typename D8>
772inline void minus(
const MatrixBase<D1>& p1,
773 const QuaternionBase<D2>& q1,
774 const MatrixBase<D4>& p2,
775 const QuaternionBase<D5>& q2,
785 od =
log_q(q1.conjugate() * q2);
788template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D6,
typename D7,
typename D8,
typename D9>
789inline void minus(
const MatrixBase<D1>& p1,
790 const QuaternionBase<D2>& q1,
791 const MatrixBase<D4>& p2,
792 const QuaternionBase<D5>& q2,
795 MatrixBase<D8>& J_do_q1,
796 MatrixBase<D9>& J_do_q2)
798 minus(p1, q1, p2, q2, pd, od);
804template <
typename D1,
typename D2,
typename D4,
typename D5,
typename D7,
typename D8>
805inline void minus(
const MatrixBase<D1>& p1,
806 const MatrixBase<D2>& q1,
807 const MatrixBase<D4>& p2,
808 const MatrixBase<D5>& q2,
815 Map<const Quaternion<typename D2::Scalar>> mq1(&q1(0));
816 Map<const Quaternion<typename D5::Scalar>> mq2(&q2(0));
818 minus(p1, mq1, p2, mq2, pd, od);
821template <
typename D1,
typename D2,
typename D3>
822inline void minus(
const MatrixBase<D1>& d1,
const MatrixBase<D2>& d2, MatrixBase<D3>& err)
828 Map<const Matrix<typename D1::Scalar, 3, 1>> p1(&d1(0));
829 Map<const Quaternion<typename D1::Scalar>> q1(&d1(3));
830 Map<const Matrix<typename D2::Scalar, 3, 1>> p2(&d2(0));
831 Map<const Quaternion<typename D2::Scalar>> q2(&d2(3));
832 Map<Matrix<typename D3::Scalar, 3, 1>> pd(&err(0));
833 Map<Matrix<typename D3::Scalar, 3, 1>> od(&err(3));
835 minus(p1, q1, p2, q2, pd, od);
838template <
typename D1,
typename D2,
typename D3,
typename D4,
typename D5>
839inline void minus(
const MatrixBase<D1>& d1,
840 const MatrixBase<D2>& d2,
842 MatrixBase<D4>& J_diff_d1,
843 MatrixBase<D5>& J_diff_d2)
851 Map<const Matrix<typename D1::Scalar, 3, 1>> p1(&d1(0));
852 Map<const Quaternion<typename D1::Scalar>> q1(&d1(3));
853 Map<const Matrix<typename D2::Scalar, 3, 1>> p2(&d2(0));
854 Map<const Quaternion<typename D2::Scalar>> q2(&d2(3));
855 Map<Matrix<typename D3::Scalar, 3, 1>> pd(&dif(0));
856 Map<Matrix<typename D3::Scalar, 3, 1>> od(&dif(3));
858 Matrix<typename D4::Scalar, 3, 3> J_do_q1, J_do_q2;
860 minus(p1, q1, p2, q2, pd, od, J_do_q1, J_do_q2);
870 J_diff_d1 = -Matrix<typename D4::Scalar, 6, 6>::Identity();
871 J_diff_d1.block(3, 3, 3, 3) = J_do_q1;
873 J_diff_d2.setIdentity(6, 6);
874 J_diff_d2.block(3, 3, 3, 3) = J_do_q2;
877template <
typename D1,
typename D2>
878inline Matrix<typename D1::Scalar, 6, 1>
minus(
const MatrixBase<D1>& d1,
const MatrixBase<D2>& d2)
880 Matrix<typename D1::Scalar, 6, 1> ret;
889 minus(x1.at(
'P'), x1.at(
'O'), x2.at(
'P'), x2.at(
'O'), pd, od);
904template <
typename D1,
typename D2,
typename D3>
906 const MatrixBase<D2>& d2,
907 const typename D1::Scalar& t,
914 Matrix<typename D1::Scalar, 7, 1> dd =
between(d1, d2);
916 Matrix<typename D1::Scalar, 6, 1> tau = t *
log(dd);
921template <
typename D1,
typename D2>
922inline Matrix<typename D1::Scalar, 7, 1>
interpolate(
const MatrixBase<D1>& d1,
923 const MatrixBase<D2>& d2,
924 const typename D1::Scalar& t)
926 Matrix<typename D1::Scalar, 7, 1> ret;
949template <
typename D1,
typename D2>
950inline void toSE3(
const MatrixBase<D1>& pose, MatrixBase<D2>& SE3)
955 typedef typename D1::Scalar T;
957 SE3.template block<3, 1>(0, 3) = pose.template head<3>();
958 SE3.template block<3, 3>(0, 0) =
q2R(pose.template tail<4>());
959 SE3.template block<1, 3>(3, 0).setZero();
964inline Matrix<typename D::Scalar, 4, 4>
toSE3(
const MatrixBase<D>& pose)
966 Matrix<typename D::Scalar, 4, 4> SE3;
Definition: vector_composite.h:27
Namespace extending Eigen definitions.
Definition: wolf.h:94
void interpolate(const MatrixBase< D1 > &d1, const MatrixBase< D2 > &d2, const typename D1::Scalar &t, MatrixBase< D3 > &ret)
Definition: SE3.h:905
Matrix< typename D1::Scalar, 3, 3 > Q_helper(const MatrixBase< D1 > &v, const MatrixBase< D2 > &w)
Q matrix of the left Jacobian of SE(3), with v the linear and w the angular parts of the tangent vect...
Definition: SE3.h:85
Matrix< typename D::Scalar, 6, 6 > jac_SE3_right_inv(const MatrixBase< D > &tangent)
Inverse of the right Jacobian of SE(3), with tangent = [rho, theta].
Definition: SE3.h:172
void identity(MatrixBase< D1 > &p, QuaternionBase< D2 > &q)
Definition: SE3.h:181
void plus(const MatrixBase< D1 > &p1, const QuaternionBase< D2 > &q1, const MatrixBase< D4 > &p2, const MatrixBase< D5 > &o2, MatrixBase< D7 > &plus_p, QuaternionBase< D8 > &plus_q)
Definition: SE3.h:696
void log(const MatrixBase< D1 > &p, const QuaternionBase< D2 > &q, MatrixBase< D3 > &rho, MatrixBase< D4 > &theta)
Definition: SE3.h:602
Matrix< typename D::Scalar, 6, 6 > jac_SE3_right(const MatrixBase< D > &tangent)
Right Jacobian of SE(3), with tangent = [rho, theta].
Definition: SE3.h:143
void minus(const MatrixBase< D1 > &p1, const QuaternionBase< D2 > &q1, const MatrixBase< D4 > &p2, const QuaternionBase< D5 > &q2, MatrixBase< D7 > &pd, MatrixBase< D8 > &od)
Definition: SE3.h:772
void compose(const MatrixBase< D1 > &p1, const QuaternionBase< D2 > &q1, const MatrixBase< D4 > &p2, const QuaternionBase< D5 > &q2, MatrixBase< D7 > &pc, QuaternionBase< D8 > &qc)
Definition: SE3.h:296
VectorComposite identityComposite()
Definition: SE3.h:224
Matrix< typename D::Scalar, 6, 6 > jac_SE3_left_inv(const MatrixBase< D > &tangent)
Inverse of the left Jacobian of SE(3), with tangent = [rho, theta].
Definition: SE3.h:151
void exp(const MatrixBase< D1 > &rho, const MatrixBase< D2 > &theta, MatrixBase< D3 > &p, QuaternionBase< D4 > &q)
Definition: SE3.h:510
void toSE3(const MatrixBase< D1 > &pose, MatrixBase< D2 > &SE3)
Definition: SE3.h:950
void inverse(const MatrixBase< D1 > &p, const QuaternionBase< D2 > &q, MatrixBase< D4 > &ip, QuaternionBase< D5 > &iq)
Definition: SE3.h:235
Matrix< typename D::Scalar, 6, 6 > jac_SE3_left(const MatrixBase< D > &tangent)
Left Jacobian of SE(3), with tangent = [rho, theta].
Definition: SE3.h:122
void between(const MatrixBase< D1 > &p1, const QuaternionBase< D2 > &q1, const MatrixBase< D4 > &p2, const QuaternionBase< D5 > &q2, MatrixBase< D7 > &p12, QuaternionBase< D8 > &q12)
Definition: SE3.h:433
Jet< T, N > sin(const Jet< T, N > &f)
Definition: jet.h:641
Jet< T, N > sqrt(const Jet< T, N > &f)
Definition: jet.h:617
Jet< T, N > cos(const Jet< T, N > &f)
Definition: jet.h:626
Definition: capture_base.h:23
Eigen::Matrix< typename Derived::Scalar, 3, 3 > q2R(const Eigen::QuaternionBase< Derived > &_q)
quaternion to rotation matrix conversion
Definition: rotations.h:109
Eigen::Matrix< typename Derived::Scalar, 3, 3 > jac_SO3_right_inv(const Eigen::MatrixBase< Derived > &_theta)
Compute Jrinv (inverse of Right Jacobian which corresponds to the jacobian of log) Right Jacobian for...
Definition: rotations.h:463
Eigen::Quaternion< typename Derived::Scalar > exp_q(const Eigen::MatrixBase< Derived > &_v)
Quaternion exponential map.
Definition: rotations.h:258
Eigen::Matrix< typename Derived::Scalar, 3, 3 > jac_SO3_left(const Eigen::MatrixBase< Derived > &_theta)
Compute Jl (Left Jacobian) Left Jacobian for exp map in SO(3) - equation (10.86) and following equati...
Definition: rotations.h:497
Eigen::Matrix< typename Derived::Scalar, 3, 3 > jac_SO3_right(const Eigen::MatrixBase< Derived > &_theta)
Compute Jr (Right Jacobian) Right Jacobian for exp map in SO(3) - equation (10.86) and following equa...
Definition: rotations.h:423
Eigen::Matrix< typename Derived::Scalar, 3, 1 > log_q(const Eigen::QuaternionBase< Derived > &_q)
Quaternion logarithmic map.
Definition: rotations.h:287
Eigen::Matrix< typename Derived::Scalar, 3, 3 > jac_SO3_left_inv(const Eigen::MatrixBase< Derived > &_theta)
Compute Jl_inv (inverse of Left Jacobian which corresponds to the jacobian of log) Left Jacobian for ...
Definition: rotations.h:536
Eigen::Matrix< typename Derived::Scalar, 3, 3 > skew(const Eigen::MatrixBase< Derived > &_v)
Skew symmetric matrix.
Definition: rotations.h:70
static void check(const Eigen::MatrixBase< T > &t)
Assert matrix size dynamically or statically.
Definition: eigen_assert.h:93